#pragma once

#include <iostream>

namespace model
{
    //

    enum class Element
    {
        Gold,
        Wood,
        Water,
        Fire,
        Earth,
        Central,
    };

    enum class SkillLevel
    {
        Saint,
        Heaven,
        Earth,
        Mystic,
        Yellow
    };

    enum class SkillGrade
    {
        One,
        Two,
        Three,
        Four,
        Five
    };

    struct Skill
    {
        std::string name;
        Element element;
        SkillLevel level;
        SkillGrade grade;

        bool operator==(const Skill &other) const
        {
            return name == other.name && element == other.element && level == other.level && grade == other.grade;
        }
    };
    using Skills = std::vector<Skill>;

    struct baseProperty
    {
        std::string name;
        Skill skill;
        int attack{0};
        int defense{0};
        int HP{0}; // health points

        bool operator==(const baseProperty &other) const
        {
            return name == other.name && skill == other.skill && attack == other.attack && defense == other.defense && HP == other.HP;
        }
    };

    using Hero = baseProperty;
    using Botany = baseProperty;
    using Animal = baseProperty;
    using Mineral = baseProperty;
}